package com.zenithmind.task.pojo.dto;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;

import jakarta.validation.constraints.*;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;

/**
 * 任务DTO类
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
@Data
public class TaskDTO {

    /**
     * 任务ID（更新时需要）
     */
    private String id;

    /**
     * 任务标题
     */
    @NotBlank(message = "任务标题不能为空")
    @Size(max = 200, message = "任务标题长度不能超过200个字符")
    private String title;

    /**
     * 任务描述
     */
    @Size(max = 5000, message = "任务描述长度不能超过5000个字符")
    private String description;

    /**
     * 任务状态：1-待办，2-进行中，3-已完成，4-已取消，5-已暂停
     */
    @Min(value = 1, message = "任务状态值无效")
    @Max(value = 5, message = "任务状态值无效")
    private Integer status;

    /**
     * 优先级：1-低，2-中，3-高，4-紧急
     */
    @Min(value = 1, message = "优先级值无效")
    @Max(value = 4, message = "优先级值无效")
    private Integer priority;

    /**
     * 任务类型：1-个人任务，2-团队任务，3-项目任务
     */
    @Min(value = 1, message = "任务类型值无效")
    @Max(value = 3, message = "任务类型值无效")
    private Integer taskType;

    /**
     * 任务分类ID
     */
    private String categoryId;

    /**
     * 任务标签列表
     */
    private List<String> tagList;

    /**
     * 负责人ID
     */
    private String assigneeId;

    /**
     * 项目ID
     */
    private String projectId;

    /**
     * 父任务ID
     */
    private String parentId;

    /**
     * 计划开始时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime plannedStartTime;

    /**
     * 计划结束时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime plannedEndTime;

    /**
     * 预估工时（小时）
     */
    @DecimalMin(value = "0.0", message = "预估工时不能为负数")
    @DecimalMax(value = "9999.99", message = "预估工时不能超过9999.99小时")
    private BigDecimal estimatedHours;

    /**
     * 任务进度（0-100）
     */
    @Min(value = 0, message = "任务进度不能小于0")
    @Max(value = 100, message = "任务进度不能大于100")
    private Integer progress;

    /**
     * 是否重要
     */
    private Boolean isImportant;

    /**
     * 是否紧急
     */
    private Boolean isUrgent;

    /**
     * 是否重复任务
     */
    private Boolean isRecurring;

    /**
     * 重复规则（JSON格式）
     */
    private String recurrenceRule;

    /**
     * 提醒时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime reminderTime;

    /**
     * 提醒方式：1-系统通知，2-邮件，3-短信，4-微信
     */
    @Min(value = 1, message = "提醒方式值无效")
    @Max(value = 4, message = "提醒方式值无效")
    private Integer reminderType;

    /**
     * 自定义字段
     */
    private Object customFields;

    /**
     * 备注
     */
    @Size(max = 500, message = "备注长度不能超过500个字符")
    private String remark;

    /**
     * 协作者ID列表
     */
    private List<String> collaboratorIds;

    /**
     * 依赖任务ID列表
     */
    private List<String> dependencyTaskIds;

    /**
     * 子任务列表
     */
    private List<TaskDTO> subtasks;

    /**
     * 检查清单项目
     */
    private List<ChecklistItemDTO> checklistItems;

    /**
     * 检查清单项目DTO
     */
    @Data
    public static class ChecklistItemDTO {
        /**
         * 项目ID
         */
        private String id;

        /**
         * 项目内容
         */
        @NotBlank(message = "检查清单项目内容不能为空")
        private String content;

        /**
         * 是否完成
         */
        private Boolean completed;

        /**
         * 排序权重
         */
        private Integer sortOrder;
    }
}
